Skip to content

fix: avoid KeepAlive NPE when idle fires before WS handshake - #30

Merged
typefield merged 6 commits into
open-dingtalk:mainfrom
typefield:fix/keepalive-npe-idle-before-handshake
Jul 30, 2026
Merged

fix: avoid KeepAlive NPE when idle fires before WS handshake#30
typefield merged 6 commits into
open-dingtalk:mainfrom
typefield:fix/keepalive-npe-idle-before-handshake

Conversation

@typefield

@typefield typefield commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Summary

修复 WebSocket 握手、停止流程、代理认证、资源释放和制品构建中的稳定性问题:

  • 握手完成前不调度 ping,channel inactive 时清理 keepalive 状态
  • 连接失败/超时关闭 channel;I/O 异常保留明确日志、protocol/detail 和 cause
  • ping/connect timeout 使用 channel event loop,不再泄漏静态 HashedWheelTimer
  • 最后一个客户端停止时释放共享 NioEventLoopGroup
  • session pool 停止时终止调度器和 session,忽略停止后晚到的重连任务
  • stop() 在 start 前、正常运行和初始化失败后都终止 consumer executor
  • SYSTEM 控制帧绕过饱和业务 executor;EVENT 过载回复 LATER
  • OpenAPI HTTP 流、连接和 timeout 对称清理
  • Java 8 认证代理凭证仅在一次请求期间生效,匹配 proxy host/port,并发客户端隔离;结束后恢复宿主默认 Authenticator
  • builder/dispatcher/subscription 使用快照,避免调用方后续修改内部配置
  • 修复 shade ServiceLoader、fastjson include、重复 package 污染和 parent version
  • 版本升级至 1.3.14,增加 JDK 8/17/21/24 PR 测试工作流

Related issues

Closes #25.
Refs #26.
Refs #16.
Refs #29.

#16/#29 的无信息异常路径已修;具体 Docker 网络环境仍需用户升级后验证。

Validation

  • JDK 8/17/21/24:完整 Maven reactor tests
  • JDK 8:mvn clean package
  • Java 测试套件连续 10 轮
  • 100 个并发代理客户端凭证隔离测试
  • shaded jar 重复 package 与 ServiceLoader smoke test
  • actionlintgit diff --check

玉澜 and others added 6 commits July 23, 2026 15:35
IdleStateHandler can emit IdleStateEvent after TCP connect but before
WebSocket handshake completes. KeepAliveHandler previously dereferenced
a null channel field, logging "connection operation failed" and leaving
half-dead connections that recovered only after pool retry.

Also close the channel in exceptionCaught so the session pool reconnects
promptly. Fixes customer intermittent Stream disconnect (Aone 84622857).

Co-authored-by: Cursor <cursoragent@cursor.com>
Strengthen regression for Aone 84622857 KeepAlive NPE and ensure
NettyClientHandler closes channel on connection failures.

Co-authored-by: Cursor <cursoragent@cursor.com>
@wxianfeng

Copy link
Copy Markdown

CR 结论:LGTM,未发现阻断项。

已核对 head b248102。重点审查了共享 Netty EventLoop 引用计数、client/pool/executor 关闭顺序、握手和 ping 超时清理、异常后 channel 关闭重连、consumer 背压、代理认证器的作用域与恢复,以及 shaded jar 的 ServiceLoader 资源合并。生命周期与资源释放路径完整,Java 8 兼容分支也有针对性测试。

本地验证(macOS / JDK 11):

  • mvn -B -ntp package 全 reactor BUILD SUCCESS
  • 新增/相关测试共 23 项通过

GitHub CI:4/4 通过。

@typefield
typefield merged commit 4d401c6 into open-dingtalk:main Jul 30, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

如何停止服务?

2 participants